home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 3 / AGA Experience Volume 3 (1997)(NFA - SAdENESS)[!].iso / software / utilities / programmers / c_dt / dt_source / startup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-30  |  3.9 KB  |  176 lines

  1. /*
  2. **      $VER: StartUp.c 43.3 (30.11.96)
  3. **
  4. **      Library startup-code and function table definition
  5. **
  6. **      (C) Copyright 1996 Andreas R. Kleinert
  7. **      All Rights Reserved.
  8. */
  9.  
  10. #define __USE_SYSBASE
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/libraries.h>
  15. #include <exec/execbase.h>
  16. #include <exec/resident.h>
  17. #include <exec/initializers.h>
  18.  
  19. #include <proto/exec.h>
  20.  
  21. #include <class/classbase.h>
  22. #include "libfuncs.h"
  23.  
  24.  
  25. extern ULONG __saveds __stdargs L_OpenLibs(void);
  26. extern void  __saveds __stdargs L_CloseLibs(void);
  27.  
  28.  
  29. struct ClassBase * __saveds __asm InitLib( register __a6 struct ExecBase      *sysbase,
  30.                                              register __a0 struct SegList       *seglist,
  31.                                              register __d0 struct ClassBase *exb);
  32.  
  33. struct ClassBase * __saveds __asm OpenLib( register __a6 struct ClassBase *ClassBase);
  34. struct SegList * __saveds __asm CloseLib( register __a6 struct ClassBase *ClassBase);
  35. struct SegList * __saveds __asm ExpungeLib( register __a6 struct ClassBase *exb);
  36. ULONG __saveds __asm ExtFuncLib(void);
  37.  
  38.  
  39. LONG __saveds __asm LibStart(void)
  40. {
  41.  return(-1);
  42. }
  43.  
  44. extern APTR FuncTab [];
  45. extern struct MyDataInit DataTab;
  46.  
  47. struct InitTable
  48. {
  49.  ULONG              LibBaseSize;
  50.  APTR              *FunctionTable;
  51.  struct MyDataInit *DataTable;
  52.  APTR               InitLibTable;
  53. } InitTab =
  54. {
  55.  sizeof(struct ClassBase),
  56.  &FuncTab[0],
  57.  &DataTab,
  58.  InitLib
  59. };
  60.  
  61. APTR FuncTab [] =
  62. {
  63.  OpenLib,
  64.  CloseLib,
  65.  ExpungeLib,
  66.  ExtFuncLib,
  67.  
  68.  ObtainPicClass,
  69.  
  70.  (APTR) ((LONG)-1)
  71. };
  72.  
  73.  
  74. extern struct ClassBase *ClassBase;
  75.  
  76.  
  77. struct ClassBase * __saveds __asm InitLib( register __a6 struct ExecBase      *sysbase,
  78.                                              register __a0 struct SegList       *seglist,
  79.                                              register __d0 struct ClassBase *exb)
  80. {
  81.  ClassBase = exb;
  82.  
  83.  ClassBase->cb_SysBase = sysbase;
  84.  ClassBase->cb_SegList = seglist;
  85.  
  86.  if(L_OpenLibs()) return(ClassBase);
  87.  
  88.  L_CloseLibs();
  89.  
  90.  return(NULL);
  91. }
  92.  
  93. struct ClassBase * __saveds __asm OpenLib( register __a6 struct ClassBase *ClassBase)
  94. {
  95.  ClassBase->cb_LibNode.lib_OpenCnt++;
  96.  
  97.  ClassBase->cb_LibNode.lib_Flags &= ~LIBF_DELEXP;
  98.  
  99.  return(ClassBase);
  100. }
  101.  
  102. struct SegList * __saveds __asm CloseLib( register __a6 struct ClassBase *ClassBase)
  103. {
  104.  ClassBase->cb_LibNode.lib_OpenCnt--;
  105.  
  106.  if(!ClassBase->cb_LibNode.lib_OpenCnt)
  107.   {
  108.    if(ClassBase->cb_LibNode.lib_Flags & LIBF_DELEXP)
  109.     {
  110.      return( ExpungeLib(ClassBase) );
  111.     }
  112.   }
  113.  
  114.  return(NULL);
  115. }
  116.  
  117. struct SegList * __saveds __asm ExpungeLib( register __a6 struct ClassBase *exb)
  118. {
  119.  struct ClassBase *ClassBase = exb;
  120.  struct SegList       *seglist;
  121.  
  122.  if(!ClassBase->cb_LibNode.lib_OpenCnt)
  123.   {
  124.    ULONG negsize, possize, fullsize;
  125.    UBYTE *negptr = (UBYTE *) ClassBase;
  126.  
  127.    seglist = ClassBase->cb_SegList;
  128.  
  129.    Remove(ClassBase);
  130.  
  131.    L_CloseLibs();
  132.  
  133.    negsize  = ClassBase->cb_LibNode.lib_NegSize;
  134.    possize  = ClassBase->cb_LibNode.lib_PosSize;
  135.    fullsize = negsize + possize;
  136.    negptr  -= negsize;
  137.  
  138.    FreeMem(negptr, fullsize);
  139.  
  140.    return(seglist);
  141.   }
  142.  
  143.  ClassBase->cb_LibNode.lib_Flags |= LIBF_DELEXP;
  144.  
  145.  return(NULL);
  146. }
  147.  
  148. ULONG __saveds __asm ExtFuncLib(void)
  149. {
  150.  return(NULL);
  151. }
  152.  
  153. struct ClassBase *ClassBase = NULL;
  154.  
  155. #ifdef __SASC
  156.  
  157. ULONG XCEXIT       = NULL;  /* these symbols may be referenced by    */
  158. ULONG _XCEXIT      = NULL;  /* some functions of sc.lib, but should  */
  159. ULONG ONBREAK      = NULL;  /* never be used inside a shared library */
  160. ULONG _ONBREAK     = NULL;
  161. ULONG base         = NULL;
  162. ULONG _base        = NULL;
  163. ULONG ProgramName  = NULL;
  164. ULONG _ProgramName = NULL;
  165. ULONG StackPtr     = NULL;
  166. ULONG _StackPtr    = NULL;
  167. ULONG oserr        = NULL;
  168. ULONG _oserr       = NULL;
  169. ULONG OSERR        = NULL;
  170. ULONG _OSERR       = NULL;
  171.  
  172. void __regargs __chkabort(void) { }  /* a shared library cannot be    */
  173. void __regargs _CXBRK(void)     { }  /* CTRL-C aborted when doing I/O */
  174.  
  175. #endif /* __SASC */
  176.